package xcmg.device.service.basic;

import java.util.List;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import xcmg.device.dao.entity.basic.SystemParameter;
import xcmg.device.dao.mapper.basic.SystemParameterMapper;
import xcmg.device.util.JedisUtils;

/**
 * 拉一个service层便于以后配置数据较多时用redis缓存，调用方不需改动
 *
 * @author wangyong
 */
@Service
public class SystemParameterService {

  @Autowired
  private SystemParameterMapper systemParameterMapper;

  @Autowired
  private JedisUtils jedisUtils;

  /**
   * 参数过期时间。默认1小时。key以参数type开头，便于集中删除key
   * 默认时间先给短一些
   */
  private static final Long PARAMETER_EXPRIED_TIME = 60*60*1L;
  //公司创建发货通知单是否需要审核配置，对应system_parameter表的PARAM_TYPE字段
  private static final String DELIVERY_NOTE_AUDIT = "DELIVERYNOTE_AUDIT_COM";
  //公司创建发运交接单是否需要审核配置，对应system_parameter表的PARAM_TYPE字段
  private static final String DELIVERY_RECEIPT_AIDUT = "DELIVERYRECEIPT_AUDIT_COM";
  //公司创建领料单是否需要审核配置，对应system_parameter表的PARAM_TYPE字段
  private static final String MATERIALSSCHEDULE_AIDUT = "MATERIALSSCHEDULE_AUDIT_COM";
  //公司创建其它出库单是否需要审核配置，对应system_parameter表的PARAM_TYPE字段
  private static final String ABNORMAL_OUT_AUDIT = "ABNORMALOUT_AUDIT_COM";
  //公司创建其它入库单是否需要审核配置，对应system_parameter表的PARAM_TYPE字段
  private static final String ABNORMAL_IN_AUDIT = "ABNORMALIN_AUDIT_COM";

  /**
   * 获取公司私有的参数list
   *
   * @param orgId
   */
  public List<SystemParameter> listByParamType(String paramType, String orgId) {
    String redisKey = paramType + "_" + orgId + "_SYSTEM_PARAM_LIST_BY_PARAM_TYPE";
    if (jedisUtils.exists(redisKey)) {
      return (List<SystemParameter>)jedisUtils.get(redisKey);
    }
    List<SystemParameter> parameterList = systemParameterMapper.listPriParamByType(paramType, orgId);
    if (CollectionUtils.isNotEmpty(parameterList)) {
      jedisUtils.set(redisKey, parameterList, PARAMETER_EXPRIED_TIME);
    }
    return parameterList;
  }

  /**
   * 获取公用的参数list
   *
   * @param paramType
   */
  public List<SystemParameter> listByParamType(String paramType) {

    String redisKey = paramType + "_SYSTEM_PARAM_LIST_BY_PARAM_TYPE";
    if (jedisUtils.exists(redisKey)) {
      return (List<SystemParameter>)jedisUtils.get(redisKey);
    }

    List<SystemParameter> parameterList = systemParameterMapper.listByParamType(paramType);
    if (CollectionUtils.isNotEmpty(parameterList)) {
      jedisUtils.set(redisKey, parameterList, PARAMETER_EXPRIED_TIME);
    }
    return parameterList;
  }

  /**
   * 获取公司私有的参数
   *
   * @param orgId
   */
  public SystemParameter getByParamKey(String paramType, Short paramKey, String orgId) {
    String redisKey = paramType + "_" + paramKey + "_" + orgId + "_SYSTEM_PARAM_GET_BY_PARAM_KEY";
    if (jedisUtils.exists(redisKey)) {
      return (SystemParameter)jedisUtils.get(redisKey);
    }
    SystemParameter systemParameter = systemParameterMapper.getPriParamByKey(paramType, paramKey, orgId);
    if (null != systemParameter) {
      jedisUtils.set(redisKey, systemParameter, PARAMETER_EXPRIED_TIME);
    }
    return systemParameter;
  }

  /**
   * 获取公用的参数
   *
   *@param paramKey
   */
  public SystemParameter getByParamKey(String paramType, Short paramKey) {

    String redisKey = paramType + "_" + paramKey + "_SYSTEM_PARAM_GET_BY_PARAM_KEY";
    if (jedisUtils.exists(redisKey)) {
      return (SystemParameter)jedisUtils.get(redisKey);
    }
    SystemParameter systemParameter = systemParameterMapper.getByParamKey(paramType, paramKey);
    if (null != systemParameter) {
      jedisUtils.set(redisKey, systemParameter, PARAMETER_EXPRIED_TIME);
    }
    return systemParameter;
  }

  /**
   * @Des 判断公司是否配置为发货通知单需要审核操作
   * @Date 2021/4/11 17:38
   * @Author wangzhaoyu
   * @Param [orgId]
   * @Return boolean
   */
  public boolean getDeliveryNoteAuditSetting(String orgId){
    if(StringUtils.isEmpty(orgId)){
      return false;
    }
    List<SystemParameter> systemParameters = listByParamType(DELIVERY_NOTE_AUDIT);
    return containsParam(systemParameters,orgId);
  }

  /**
   * @Des 判断公司是否配置为发运交接单需要审核操作
   * @Date 2021/4/13 14:44
   * @Author wangzhaoyu
   * @Param [orgId]
   * @Return boolean
   */
  public boolean getDeliveryReceiptAuditSetting(String orgId){
    if(StringUtils.isEmpty(orgId)){
      return false;
    }
    List<SystemParameter> systemParameters = listByParamType(DELIVERY_RECEIPT_AIDUT);
    return containsParam(systemParameters,orgId);
  }

  /**
   * @Des 判断是否配置为领料单需要审核操作
   * @Date 2021/4/14 10:12
   * @Author wangzhaoyu
   * @Param [orgId]
   * @Return boolean
   */
  public boolean getMaterialsScheduleAuditSetting(String orgId){
    if(StringUtils.isEmpty(orgId)){
      return false;
    }
    List<SystemParameter> systemParameters = listByParamType(MATERIALSSCHEDULE_AIDUT);
    return containsParam(systemParameters,orgId);
  }

  /**
   * @Des 判断是否配置为其它出库单需要审核操作
   * @Date 2021/4/14 10:12
   * @Author wangzhaoyu
   * @Param [orgId]
   * @Return boolean
   */
  public boolean getAbnormalOutAuditSetting(String orgId){
    if(StringUtils.isEmpty(orgId)){
      return false;
    }
    List<SystemParameter> systemParameters = listByParamType(ABNORMAL_OUT_AUDIT);
    return containsParam(systemParameters,orgId);
  }

  /**
   * @Des 判断是否配置为其它入库单需要审核操作
   * @Date 2021/4/14 10:12
   * @Author wangzhaoyu
   * @Param [orgId]
   * @Return boolean
   */
  public boolean getAbnormalInAuditSetting(String orgId){
    if(StringUtils.isEmpty(orgId)){
      return false;
    }
    List<SystemParameter> systemParameters = listByParamType(ABNORMAL_IN_AUDIT);
    return containsParam(systemParameters,orgId);
  }


  private boolean containsParam(List<SystemParameter> sourceParameters, String target) {
    if(CollectionUtils.isEmpty(sourceParameters)) {
      return false;
    }
    for (SystemParameter parameter : sourceParameters) {
      if (target.equals(parameter.getParamValue())) {
        return true;
      }
    }
    return false;
  }

  /**
   * 批量清除
   * @param paramType
   */
  public void refreshParamCache(String paramType) {
    JedisUtils.batchDel(paramType);
  }
}
